/**
 * Created by L.jp
 * Description:
 * User: 86189
 * Date: 2023-04-24
 * Time: 20:19
 */
class ListNode {
    int val;
    ListNode next = null;
    public ListNode(int val) {
      this.val = val;
    }
  }
public class Solution {
    public ListNode deleteDuplicationNode (ListNode pHead) {
        if(pHead==null || pHead.next==null){
            return pHead;
        }
        //定义新的头节点，以防第一个节点和第二个节点就是相同节点的情况
        ListNode newHead=new ListNode(-1);
        newHead.next=pHead;
        //前驱，用于构造新的链表，遇到重复的直接删除
        ListNode pre=newHead;
        //遍历链表
        ListNode cur=pHead;
        while (cur!=null && cur.next!=null){
            //如果当前节点值等于下一个节点值，那么还需要判断是否有等个相等的值，直到出现不相等的值
            if (cur.val== cur.next.val){
                //找到不相等的值
                while (cur.next!=null && cur.val==cur.next.val){
                    cur=cur.next;
                }
                //找到不相等的值之后还不能立刻确定为新的节点，还不知道后面是否有新的重复节点，所以只是先把之前重复的节点抛弃，只需要改变前驱节点的指向就行了
                pre.next=cur.next;
            }else {
                //如果是不相等的节点，就可以作为新的链表节点，直接赋值
                pre=cur;
            }
            //都需要一个一个节点遍历
            cur=cur.next;
        }
        return newHead.next;
    }
}
